# 指的是在一定时间内按照时间顺序测量的某个变量的取值序列

# 时间序列包含三种应用场景，分别是：
# 特定的时刻（timestamp），也就是时间戳；
# 固定的日期（period），比如某年某月某日；
# 时间间隔（interval），每隔一段时间具有规律性；

from datetime import datetime
import pandas as pd
import numpy as np

# 数据类型为datetime
print(datetime.now())  # 2022-04-20 16:24:28.180940

print(pd.Timestamp('2017-03-01'))  # 创建时间戳 2017-03-01 00:00:00
print(pd.Timestamp(1587687255, unit='s'))
# freq表示时间频率，每30min变化一次
print(pd.date_range("9:00", "18:10", freq="30min").time)
# [datetime.time(9, 0) datetime.time(9, 30) datetime.time(10, 0)
#  datetime.time(10, 30) datetime.time(11, 0) datetime.time(11, 30)
#  datetime.time(12, 0) datetime.time(12, 30) datetime.time(13, 0)
#  datetime.time(13, 30) datetime.time(14, 0) datetime.time(14, 30)
#  datetime.time(15, 0) datetime.time(15, 30) datetime.time(16, 0)
#  datetime.time(16, 30) datetime.time(17, 0) datetime.time(17, 30)
#  datetime.time(18, 0)]

# 修改为按小时
print(pd.date_range("6:10", "11:45", freq="H").time)
#  to_datetime() 函数将 series 或 list 转换为日期对象，其中 list 会转换为DatetimeIndex
print(pd.to_datetime(pd.Series(['Jun 3, 2020', '2020-12-10', None])))

# 频率和周期转换
# # 频率和周期转换Time Periods 表示时间跨度，一段时间周期，它被定义在 Pandas Periods 类中，通过该类提供的方法可以实现将频率转换为周期。
# 比如 Periods() 方法，可以将频率 "M"（月）转换为 Period（时间段）。
x = pd.Period('2014', freq='M')
# start参数
x.asfreq('D', 'start')
# end参数
x.asfreq('D', 'end')
# Period('2014-01-01', 'D')
# Period('2014-01-31', 'D')

# 对于常用的时间序列频率，Pandas 为其规定了一些字符串别名，我们将这些别名称为“offset（偏移量）”
# B	工作日频率	BQS	工作季度开始频率
# D	日历日频率	A	年终频率
# W	每周频率	BA	工作年度结束频率
# M	月末频率	BAS	工作年度开始频率
# SM	半月结束频率	BH	营业时间频率
# BM	工作月结束频率	H	小时频率
# MS	月开始频率	T,min	每分钟频率
# SMS	半月开始频率	S	每秒钟频率
# BMS	工作月开始频率	L,ms	毫秒
# Q	季末频率	U,us	微妙
# BQ	工作季度结束频率	N	纳秒
# QS	季度开始频率

# 定义时期period，默认freq="Y"年份
p1 = pd.Period('2020')
p2 = pd.Period('2019')
# 使用f''格式化输出
print(f'p1={p1}年')
print(f'p2={p2}年')
print(f'p1和p2间隔{p1 - p2}年')
# f''表示字符串格式化输出
print(f'五年前是{p1 - 5}年')

# 字符串日期转换为 Period，首先需要将字符串转换为日期格式，然后再将日期转换为 Period
# 创建时间序列
index = pd.date_range("2020-03-17", "2020-03-30", freq="1.5H")
# 随机选取4个互不相同的数
loc = np.random.choice(np.arange(len(index)), size=4, replace=False)
loc.sort()
ts_index = index[loc]
pd_index = ts_index.to_periods('D')
pd_index()

# 建议使用Python的datetime模块创建时间
start = pd.datetime(2019, 1, 1)
end = pd.datetime(2019, 1, 5)
print(pd.date_range(start, end))

# 使用下列方法可以修改频率，比如按“天”为按“月”
print(pd.date_range('12/15/2011', periods=5, freq='M'))

# bdate_range() 表示创建工作日的日期范围，它与 date_range() 不同，它不包括周六、周日。
print(pd.date_range('11/25/2020', periods=8))
